// 1. 限制对象
// 限制person对象的具体内容，使用【,】分割，【？】代表可选属性
let person: { name: string; age?: number };

// 限制car对象的具体内容，使用【;】分割，必须有price和color属性，其它属性不去限制，有没有都行 【[propName: string]: any 】表示任意属性
let car: { price: number; color: string; [propName: string]: any };

// 限制student对象的具体内容，使用【回车】分割
let student: {
  id: string;
  grade: number;
};

// 以下代码均无警告
person = { name: "Tom" };
person = { name: "Tom", age: 18 };
car = { price: 100, color: "pink" };
student = { id: "001", grade: 3 };

// 限制函数的参数和返回值
let demo: (a: string, b: number) => string;

demo = (x, y) => {
  return x + y;
};
// 有警告
/* demo = (x, y ,z) => {
  return x + y;
}; */

// 限制数组
let arr1: number[]; // 限制arr1只能存储数字
let arr2: Array<number>; // 等价于上一行代码
let arr3: string[]; // 限制aar3只能存储字符串
let arr4: Array<string>; // 等价于上一行代码

arr1 = [1, 2, 3];
arr3 = ["a", "b", "c"];